__author__ = 'chobit'
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import thread
import time


#糗事百科爬虫类
class QSBK:
	#初始化,定义一些变量
	def __init__(self):
		self.pageIndex = 1
		self.user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
		#初始化headers
		self.headers = { 'User-Agent' : self.user_agent }
		#放段子的变量，每一个元素是每一页的段子们
		self.stories = []
		#存放程序是否继续运行的变量
		self.enable = False
	
	#传入某一页的索引获取页面代码
	def getPage(self,pageIndex):
		try:
			url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
			#构建请求的request
			request = urllib2.Request(url,headers=self.headers)
			#使用URLOPEN获取页面代码
			reponse = urllib2.urlopen(request)
			#将页面转换成UTF-8编码
			pageCode = reponse.read().decode('utf-8')
			return pageCode

		except urllib2.URLError,e:
			if not pageCode:
				print '页面加载失败......'
				return None

	#传入某一页的代码，返回筛选好的段子		
	def getPageItems(self,pageIndex):
		pageCode = self.getPage(pageIndex)
		if not pageCode:
			print "页面加载失败......"
			return None
		pattern = re.compile('<div class="author clearfix">.*?<h2>(.*?)</h2>.*?"content">(.*?)</div>.*?number">(.*?)</.*?number">(.*?)</.',re.S)
		items = re.findall(pattern,pageCode)
		pageStories = []
		for item in items:
			replaceBR = re.compile('<br/>')
			text =  re.sub(replaceBR,'\n',item[1])
			#item[0]：段子发布者，item[1]是内容，item[2]是发布时间，item[3]是点赞数
			pageStories.append([item[0].strip(),text.strip(),item[2].strip(),item[3].strip()])
			# print text
		return pageStories
	#加载并提取页面的内容，加入到列表中
	def loadPage(self):
		#如果当前未看到的页数少于2页，则加载新的一页
		if self.enable == True:
			if len(self.stories) < 2:
				#获取新的一页
				pageStories = self.getPageItems(self.pageIndex)
				#将该页的段子存放到全局List中
				if pageStories:
					self.stories.append(pageStories)
					#获取完之后页码索引加一，表示下次读取下一页
					self.pageIndex+=1
	#调用该方法，每次回车输出一个段子
	def getOneStory(self,pageStories,page):
		#遍历一页段子
		for story in pageStories:
			#等待用户输入
			input = raw_input()
			#每输入回车一次，判断一下是否要加载新页面
			self.loadPage()
			if input == 'q':
				self.enable = False
				return 
			print u"第%d页\t发布人:%s\t发布时间:%s\t赞:%s\n%s" %(page,story[0],story[2],story[3],story[1])
	#开始方法
	def start(self):
		print u"正在读取糗事百科,按回车查看新段子，q退出"
		#变量为True,程序可以正常运行
		self.enable = True
		self.loadPage()
		#局部变量，控制当前读了第几页
		nowPage = 0
		while self.enable:
			if len(self.stories) > 0:
				#从全局List中获取一页的段子
				pageStories = self.stories[0]
				#当前读到的页数加一
				nowPage +=1
				#将全局List中的第一个元素删除，因为已经取出
				del self.stories[0]
				#输出该页的段子
				self.getOneStory(pageStories,nowPage)

spider =QSBK()
# print spider.getPageItems(1)
spider.start()